GtkTextView: Fix regression in GtkSourceView drawing
authorAlexander Larsson <alexl@redhat.com>
Wed, 2 Oct 2013 13:14:56 +0000 (15:14 +0200)
committerAlexander Larsson <alexl@redhat.com>
Wed, 2 Oct 2013 14:23:41 +0000 (16:23 +0200)
GtkSourceView draws before chaining upo to GtkTextView and assumes
that this will be visible, but the pixelcache will just overdraw
that with background.

So, we stop drawing the background to the pixel cache and instead
make it an CAIRO_CONTENT_COLOR_ALPHA surface to make the previously
drawn content see through.

This is slower, but more backwards compatible.

https://bugzilla.gnome.org/show_bug.cgi?id=708423

gtk/gtktextview.c

index e34e2b33092c09becedd1bd2abdd0a6a281b92a3..63680bff1fb42ca8bfcf6278abf579257006dd74 100644 (file)
@@ -1477,6 +1477,13 @@ gtk_text_view_init (GtkTextView *text_view)
 
   priv->pixel_cache = _gtk_pixel_cache_new ();
 
+  /* Widgets inheriting from GtkTextView (like GtkSourceView) rely on being able to
+     paint before chaining up to GtkTextView.draw() and having that be visible, that
+     doesn't work unless we have alpha in the textview pixelcache. This is slightly
+     suboptimal, as it means drawing the cache is slower (and OVER operation) rather
+     than a pure blit, but is required for backwards compat. */
+  _gtk_pixel_cache_set_content (priv->pixel_cache, CAIRO_CONTENT_COLOR_ALPHA);
+
   /* Set up default style */
   priv->wrap_mode = GTK_WRAP_NONE;
   priv->pixels_above_lines = 0;
@@ -5252,18 +5259,6 @@ draw_text (cairo_t  *cr,
            gpointer  user_data)
 {
   GtkWidget *widget = user_data;
-  GtkStyleContext *context;
-  GdkRectangle bg_rect;
-
-  gdk_cairo_get_clip_rectangle (cr, &bg_rect);
-
-  context = gtk_widget_get_style_context (widget);
-  gtk_style_context_save (context);
-  gtk_style_context_add_class (context, GTK_STYLE_CLASS_VIEW);
-  gtk_render_background (context, cr,
-                         bg_rect.x, bg_rect.y,
-                         bg_rect.width, bg_rect.height);
-  gtk_style_context_restore (context);
 
   gtk_text_view_paint (widget, cr);
 }